/**
 * 
 */
package org.youisoft.summer.evaluator.function.clustering;

import java.util.List;

import org.youisoft.summer.evaluator.InvokeException;
import org.youisoft.summer.evaluator.context.CalContext;
import org.youisoft.summer.evaluator.operator.Operator;

/**
 * @author zijiang.jl
 *
 */
public class KSmartFunction extends AbstractKSeriesFunction{

	@Override
	protected void adjustCenter(double[] center,List<Number> points, int[] centerIndex) {
		for(int j=0;j<center.length;j++){
			double temp=0;
			int cnt=0;
			for(int i=0;i<centerIndex.length;i++){
				if(j==centerIndex[i]){
					temp+=points.get(i).doubleValue();
					cnt++;
				}
			}
			
			if(cnt!=0) center[j]=temp/cnt;
		}
	}
	
	@Override
	protected <C, R, P> List<Operator<?>> outlierClustering(
			CalContext<C, R, P> context, double[] center, List<Number> points,
			int[] centerIndex,double factor) throws InvokeException{
		
		Number[] max=new Number[center.length];
		Number[] min=new Number[center.length];
		
		for(int i=0;i<centerIndex.length;i++){
			for(int j=0;j<center.length;j++){
				if(centerIndex[i]==j){
					if(max[j]==null) max[j]=points.get(i);
					if(min[j]==null) min[j]=points.get(i);
					if(max[j].doubleValue()<points.get(i).doubleValue()) max[j]=points.get(i);
					if(min[j].doubleValue()>points.get(i).doubleValue()) min[j]=points.get(i);
				}
			}
		}
		
		for(int i=0;i<center.length;i++){
			for(int j=center.length-1;j>i;j--){
				double dis=center[i]-center[j];
				double x=max[i].doubleValue()-min[i].doubleValue();
				double y=max[j].doubleValue()-min[j].doubleValue();
				
				dis=dis<0?-dis:dis;
				x=x<0?-x:x;
				y=y<0?-y:y;
				
				if(x<y&&dis>=x&&dis<=y){
					
					System.out.println(true);
				}
				
				if(y<x&&dis>=y&&dis<=x){
					
					System.out.println(true);
				}
				
			}
			
		}
		
		return null;
		
	}
	
	
	
}
